// 引入其他的类
import Food from './Food';
import ScorePanel from './ScorePanel';
import Snake from './Snake';

// GameControl游戏控制器，控制其他的所有类
class GameControl {
  // 定义三个属性
  // 蛇
  snake: Snake;
  // 食物
  food: Food;
  // 分数面板
  scorePanel: ScorePanel;

  // 创建一个属性来存储蛇的移动方向（也就是按键的方向）
  direction: string = '';

  // 创建一个属性用来记录游戏是否结束
  isLive = true;

  constructor() {
    this.snake = new Snake();
    this.food = new Food();
    this.scorePanel = new ScorePanel();
    this.init();
  }

  // 游戏的初始化方法，调用后游戏即开始
  init() {
    // 绑定键盘按键按下的事件
    document.addEventListener('keydown', this.keydownHandler.bind(this));
    // 调用蛇的移动方法，让蛇动起来
    this.run();
  }

  /**
   * ArrowUp  Up
   * ArrowDown  Down
   * ArrowLeft  Left
   * ArrowRight  Right
   */
  // 创建一个键盘按下的响应函数
  keydownHandler(event: KeyboardEvent) {
    // 检查event.key的值是否合法（用户是否按了正确的按键）
    if (
      ['ArrowUp', 'ArrowDown', 'ArrowLeft', 'ArrowRight'].indexOf(event.key) ===
      -1
    ) {
      return;
    }
    // 修改direction属性
    this.direction = event.key;
  }

  // 创建一个蛇移动的方法
  run() {
    /**
     * 根据方向（this.direction）来使蛇的位置改变
     * 向上 top 减少
     * 向下 top 增加
     * 向左 left 减少
     * 向右 left 增加
     */
    // 获取蛇头的位置
    let { X, Y } = this.snake;
    switch (this.direction) {
      case 'ArrowUp':
        Y -= 10;
        break;
      case 'ArrowDown':
        Y += 10;
        break;
      case 'ArrowLeft':
        X -= 10;
        break;
      case 'ArrowRight':
        X += 10;
        break;
    }
    this.snake.X = X;
    this.snake.Y = Y;

    this.isLive &&
      setTimeout(this.run.bind(this), 300 - (this.scorePanel.level - 1) * 30);
  }
}

export default GameControl;
